#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <unistd.h>
#include <pthread.h>

// 上下文，相当于一个大号的结构体

// 线程类转换为 C 结构体
typedef struct Thread
{
    char name[1024];        // 线程名称
    pthread_t tid_;         // 线程 ID
    void *(*func_)(void *); // 函数指针
    void *args_;            // 传递给线程函数的参数
} Thread;

typedef struct Context
{
    Thread *this_;
    void *args_;
} Context;

// 线程启动函数
static void *start_routine(void *args)
{
    Context *ctx = (Context *)args;
    void *ret = ctx->this_->func_(ctx->args_);
    free(ctx);
    return ret;
}

// 创建线程
Thread *Thread_create(void *(*func)(void *), void *args, int number)
{
    Thread *thread = (Thread *)malloc(sizeof(Thread));
    assert(thread != NULL);

    // 设置线程名称
    snprintf(thread->name, sizeof(thread->name), "thread-%d", number);
    thread->func_ = func;
    thread->args_ = args;

    // 创建上下文
    Context *ctx = (Context *)malloc(sizeof(Context));
    assert(ctx != NULL);
    ctx->this_ = thread;
    ctx->args_ = args;

    // 创建线程
    int n = pthread_create(&thread->tid_, NULL, start_routine, ctx);
    assert(n == 0);
    (void)n; // 避免未使用变量警告

    return thread;
}

// 线程 join 函数
void Thread_join(Thread *thread)
{
    int n = pthread_join(thread->tid_, NULL);
    assert(n == 0);
    (void)n;
}

// 销毁线程结构体
void Thread_destroy(Thread *thread)
{
    free(thread);
}
